package com.example.myapplicationktkt2.fragment

import android.content.pm.PackageManager
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ListView
import androidx.fragment.app.Fragment
import com.example.myapplicationktkt2.R
import com.example.myapplicationktkt2.adapter.AppListAdapter
import com.example.myapplicationktkt2.model.AppInfo
import java.util.*

/**
 * 主页Fragment
 * 用于显示设备上已安装的应用程序列表
 *
 * 更新了布局文件：
 * 修改了 fragment_home.xml 布局文件，将简单的文本展示替换为 ListView，用于显示应用列表。
 * 创建了数据模型：
 * 创建了 AppInfo.kt 数据类，用于存储应用程序的详细信息，包括：
 * 应用名称
 * 包名
 * 版本名
 * 版本号
 * 图标
 * 创建了列表适配器：
 * 创建了 AppListAdapter.kt 适配器类，用于在 ListView 中显示应用信息。
 * 使用了 ViewHolder 模式来提高列表性能。
 * 创建了列表项布局：
 * 创建了 item_app.xml 布局文件，用于定义每个应用项的显示样式。
 * 更新了 HomeFragment：
 * 修改了 HomeFragment.kt 文件，实现获取设备上已安装应用程序的功能。
 * 使用 PackageManager 获取应用信息。
 * 将应用按名称排序显示。
 * 功能特点：
 * 显示所有已安装应用的名称和包名
 * 显示应用图标
 * 按应用名称字母顺序排序
 * 显示应用的版本信息
 * 使用优化的列表显示方式（ViewHolder模式）
 *
 */
class HomeFragment : Fragment() {

    private lateinit var appListView: ListView
    private lateinit var appListAdapter: AppListAdapter
    private val appList = mutableListOf<AppInfo>()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_home, container, false)
        
        appListView = view.findViewById(R.id.appListView)
        appListAdapter = AppListAdapter(requireContext(), appList)
        appListView.adapter = appListAdapter
        
        loadInstalledApps()
        
        return view
    }

    /**
     * 加载已安装的应用程序列表
     */
    private fun loadInstalledApps() {
        val packageManager = requireContext().packageManager
        val installedApps = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
        
        appList.clear()
        
        for (appInfo in installedApps) {
            val packageName = appInfo.packageName
            val appName = packageManager.getApplicationLabel(appInfo).toString()
            
            // 获取应用版本信息
            var versionName = "未知"
            var versionCode = 0
            try {
                val packageInfo = packageManager.getPackageInfo(packageName, 0)
                versionName = packageInfo.versionName ?: "未知"
                versionCode = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
                    packageInfo.longVersionCode.toInt()
                } else {
                    @Suppress("DEPRECATION")
                    packageInfo.versionCode
                }
            } catch (e: PackageManager.NameNotFoundException) {
                // 应用可能已被卸载或出现其他问题
                e.printStackTrace()
            }
            
            val icon = packageManager.getApplicationIcon(appInfo)
            
            appList.add(
                AppInfo(
                    appName,
                    packageName,
                    versionName,
                    versionCode,
                    icon
                )
            )
        }
        
        // 按应用名称排序
        appList.sortWith { app1, app2 ->
            app1.name.compareTo(app2.name, ignoreCase = true)
        }
        
        // 更新UI
        appListAdapter.notifyDataSetChanged()
    }
}